package hotel;

import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.*;
import java.util.Date;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

import com.toedter.calendar.JDateChooser;

public class FinestraCheckIn extends JFrame implements ActionListener,
		KeyListener {
	FinestraCamera f;
	private Calendar cal;
	private ImageIcon iconav = new ImageIcon("Risorse/iconav.png"),
			iconax = new ImageIcon("Risorse/iconax.png"),
			iconai = new ImageIcon("Risorse/iconai.png"),
			iconae = new ImageIcon("Risorse/iconae.png");
	private GregorianCalendar gc = new GregorianCalendar();
	private String dataCorrente = gc.get(GregorianCalendar.YEAR) + "/"
			+ (gc.get(GregorianCalendar.MONTH) + 1) + "/"
			+ gc.get(GregorianCalendar.DAY_OF_MONTH);
	private String camera;
	private ResultSet rs;
	private JComboBox<String> boxCliente;
	private JPanel pannelloPrincipale, pannelloRicerca, pannelloTabella,
			pannelloInferiore;
	private MyDefaultTableModel modelloClienti;
	private JTable tabella;
	private JScrollPane scroll;
	private JLabel cerca, prezzo, euro;
	private JTextField cercaT, prezzoT;
	private JButton inserisci;
	private int numPostiDisponibili;
	private GraficaHotel g;
	private JDateChooser chooser;

	public FinestraCheckIn(String camera, FinestraCamera f) {
		this.f = f;
		this.camera = camera;
		setTitle("Check-in Camera " + camera);
		Image immagineIc = Toolkit.getDefaultToolkit().getImage(
				"Risorse/checkInImg1.png");
		setIconImage(immagineIc);
		this.setResizable(false);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setLocation(400, 120);
		try {
			numPostiDisponibili = numeroPostiDisponibili();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		pannelloPrincipale = new JPanel(new BorderLayout());
		pannelloRicerca = new JPanel();
		pannelloTabella = new JPanel();
		pannelloInferiore = new JPanel();
		add(pannelloPrincipale);
		cerca = new JLabel("Cerca:");
		cercaT = new JTextField(20);
		cercaT.addKeyListener(this);
		boxCliente = new JComboBox<String>();
		boxCliente.addItem("Nome");
		boxCliente.addItem("Cognome");
		boxCliente.addItem("Numero di Documento");
		prezzo = new JLabel("Prezzo:");
		euro = new JLabel("€");
		try {
			rs = GraficaHotel.database.stat
					.executeQuery("SELECT prezzo FROM CAMERE where numero='"
							+ camera + "'");
			rs.next();
			prezzoT = new JTextField(5);
			prezzoT.setText(rs.getString(1));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		prezzoT.setHorizontalAlignment(SwingConstants.TRAILING);

		pannelloRicerca.add(cerca);
		pannelloRicerca.add(cercaT);
		pannelloRicerca.add(boxCliente);
		pannelloRicerca.add(prezzo);
		pannelloRicerca.add(prezzoT);
		pannelloRicerca.add(euro);
		pannelloPrincipale.add(pannelloRicerca, BorderLayout.NORTH);
		ottieniInformazioni();
		JTableHeader header1 = tabella.getTableHeader();
		header1.setReorderingAllowed(false);
		scroll = new JScrollPane(tabella);
		pannelloTabella.add(header1, BorderLayout.PAGE_START);
		pannelloTabella.add(scroll, BorderLayout.CENTER);
		pannelloPrincipale.add(pannelloTabella, BorderLayout.CENTER);
		chooser = new JDateChooser();
		chooser.setDateFormatString("dd/MM/yyyy");
		chooser.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent e) {
				cal = chooser.getCalendar();
			}
		});
		inserisci = new JButton("Inserisci");
		inserisci.addActionListener(this);
		pannelloInferiore.add(new JLabel("Data Check-out: "));
		pannelloInferiore.add(chooser);
		pannelloInferiore.add(inserisci);
		pannelloPrincipale.add(pannelloInferiore, BorderLayout.SOUTH);
		this.setVisible(true);
		pack();
	}

	class MyDefaultTableModel extends DefaultTableModel {
		private static final long serialVersionUID = 1L;

		public boolean isCellEditable(int row, int column) {
			return false;
		}
	}

	private void ottieniInformazioni() {
		try {
			modelloClienti = new MyDefaultTableModel();
			rs = GraficaHotel.database.stat
					.executeQuery("SELECT nome,cognome,DATE_FORMAT(datadinascita,'%d/%m/%Y'),numerodidocumento FROM CLIENTI where presente=0");
			ResultSetMetaData md = rs.getMetaData();
			int columnCount = md.getColumnCount();
			modelloClienti.addColumn("Nome");
			modelloClienti.addColumn("Cognome");
			modelloClienti.addColumn("Data di nascita");
			modelloClienti.addColumn("N.Documento");
			Vector<String> row;
			while (rs.next()) {
				row = new Vector<String>(3);
				for (int i = 1; i <= columnCount; i++) {
					row.add(rs.getString(i));
				}
				modelloClienti.addRow(row);
			}
			tabella = new JTable(modelloClienti);
			tabella.setGridColor(Color.LIGHT_GRAY);
			tabella.setVisible(true);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getSource() == cercaT) {
			String query = "SELECT nome,cognome,DATE_FORMAT(datadinascita,'%d/%m/%Y'),numerodidocumento FROM CLIENTI WHERE "
					+ (String) boxCliente.getSelectedItem()
					+ " like '"
					+ cercaT.getText() + "%' && presente=0";
			try {
				azzeraTabellaClienti();
				ricercaInTabellaClienti(query);
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent e) {
		// Auto-generated method stub

	}

	public void azzeraTabellaClienti() throws SQLException {
		modelloClienti.setRowCount(0);
	}// azzeraTabellaClienti

	public void ricercaInTabellaClienti(String query) throws SQLException {
		rs = GraficaHotel.database.stat.executeQuery(query);
		ResultSetMetaData md = rs.getMetaData();
		int columnCount = md.getColumnCount();
		Vector<String> row;
		while (rs.next()) {
			row = new Vector<String>(columnCount);
			for (int i = 1; i <= columnCount; i++) {
				row.add(rs.getString(i));
			}
			modelloClienti.addRow(row);
		}
		tabella.setModel(modelloClienti);
	}// ricercaTabellaClienti

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == inserisci) {
			if (cal == null) {
				JOptionPane.showMessageDialog(null,
						"Inserire una data di Check-Out", "Errore",
						JOptionPane.ERROR_MESSAGE, iconae);
				this.setVisible(true);
				return;
			}
			if (((Date) cal.getTime()).before((Date) gc.getTime())) {
				JOptionPane.showMessageDialog(null, "Inserire una data valida",
						"Errore", JOptionPane.ERROR_MESSAGE, iconae);
				this.setVisible(true);
				return;
			}
			try {
				numPostiDisponibili = numeroPostiDisponibili();
			} catch (SQLException e2) {
				e2.printStackTrace();
			}
			int[] rows = tabella.getSelectedRows();
			if (rows.length <= 0) {
				JOptionPane.showMessageDialog(null,
						"Seleziona almeno un cliente!", "Attenzione",
						JOptionPane.INFORMATION_MESSAGE, iconae);
			} else if (rows.length > numPostiDisponibili) {
				if (numPostiDisponibili == 0) {
					JOptionPane.showMessageDialog(null,
							"Non ci sono posti disponibili nella camera",
							"Errore", JOptionPane.ERROR_MESSAGE, iconax);
					dispose();
				} else if (numPostiDisponibili == 1) {
					JOptionPane.showMessageDialog(null,
							"Puo' essere inserito solamente "
									+ numPostiDisponibili
									+ " cliente nella camera.", "Errore",
							JOptionPane.ERROR_MESSAGE, iconax);
				} else
					JOptionPane.showMessageDialog(null,
							"Possono essere inseriti solamente "
									+ numPostiDisponibili
									+ " clienti nella camera.", "Errore",
							JOptionPane.ERROR_MESSAGE, iconax);
			} else {
				for (int i = 0; i < rows.length; i++) {
					try {
						GraficaHotel.database.stat
								.executeUpdate("UPDATE CLIENTI SET presente=1,datadiarrivo='"
										+ dataCorrente
										+ "' where numerodidocumento='"
										+ modelloClienti.getValueAt(rows[i], 3)
										+ "'");
						if (controlloCamera().compareTo("OCCUPATA") == 0) {
							GraficaHotel.database.stat
									.executeUpdate("UPDATE CAMERE SET numpostioccupati=numpostioccupati+1 where numero='"
											+ camera + "'");
						} else {
							GraficaHotel.database.stat
									.executeUpdate("UPDATE CAMERE SET numpostioccupati=numpostioccupati+1,stato='OCCUPATA' where numero='"
											+ camera + "'");
						}
						DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
						String s = format.format(cal.getTime());
						GraficaHotel.database.stat
								.execute("INSERT INTO ASSOCIAZIONE (numerodocumento,camera,prezzo,datadipartenza) VALUES ('"
										+ modelloClienti.getValueAt(rows[i], 3)
										+ "','"
										+ camera
										+ "','"
										+ prezzoT.getText() + "','" + s + "')");
					} catch (SQLException e1) {
						e1.printStackTrace();
					}
				}
				try {
					f.aggiornaTabellaCamere();
					f.aggiornaFinestraCamera();
					aggiornaTabellaCheckIn();
					f.g.aggiornaColoriCamera(camera, Color.RED);
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
				JOptionPane.showMessageDialog(null,
						"Operazione eseguita con successo.", "Ottimo",
						JOptionPane.DEFAULT_OPTION, iconav);
			}
		}// inserisci
	}

	private int numeroPostiDisponibili() throws SQLException {
		rs = GraficaHotel.database.stat
				.executeQuery("SELECT numeroposti,numpostioccupati FROM CAMERE where numero='"
						+ camera + "'");
		rs.next();
		return rs.getInt(1) - rs.getInt(2);
	}

	private String controlloCamera() throws SQLException {
		rs = GraficaHotel.database.stat
				.executeQuery("SELECT stato FROM CAMERE where numero='"
						+ camera + "'");
		rs.next();
		return rs.getString(1);
	}

	private void aggiornaTabellaCheckIn() throws SQLException {
		modelloClienti.setRowCount(0);
		String selezionato = "";
		if (boxCliente.getSelectedItem().equals("Nome"))
			selezionato = "nome";
		else if (boxCliente.getSelectedItem().equals("Cognome"))
			selezionato = "cognome";
		else if (boxCliente.getSelectedItem().equals("Numero di Documento"))
			selezionato = "numerodidocumento";
		rs = GraficaHotel.database.stat
				.executeQuery("SELECT nome,cognome,DATE_FORMAT(datadinascita,'%d/%m/%Y'),numerodidocumento FROM CLIENTI WHERE "
						+ selezionato
						+ " like '"
						+ cercaT.getText()
						+ "%' && presente=0");
		ResultSetMetaData md = rs.getMetaData();
		int columnCount = md.getColumnCount();
		Vector<String> row;
		while (rs.next()) {
			row = new Vector<String>(columnCount);
			for (int i = 1; i <= columnCount; i++) {
				row.add(rs.getString(i));
			}
			modelloClienti.addRow(row);
		}
		tabella.setModel(modelloClienti);
	}

}
